"""
给你两个单链表的头节点 headA 和 headB ，请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点，返回 null 。
图示两个链表在节点 c1 开始相交：
题目数据 保证 整个链式结构中不存在环。
注意，函数返回结果后，链表必须 保持其原始结构 。
示例 1：
输入：intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出：Intersected at '8'
解释：相交节点的值为 8 （注意，如果两个链表相交则不能为 0）。
从各自的表头开始算起，链表 A 为 [4,1,8,4,5]，链表 B 为 [5,0,1,8,4,5]。
在 A 中，相交节点前有 2 个节点；在 B 中，相交节点前有 3 个节点。

示例 2：
输入：intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出：Intersected at '2'
解释：相交节点的值为 2 （注意，如果两个链表相交则不能为 0）。
从各自的表头开始算起，链表 A 为 [0,9,1,2,4]，链表 B 为 [3,2,4]。
在 A 中，相交节点前有 3 个节点；在 B 中，相交节点前有 1 个节点。

示例 3：
输入：intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出：null
解释：从各自的表头开始算起，链表 A 为 [2,6,4]，链表 B 为 [1,5]。
由于这两个链表不相交，所以 intersectVal 必须为 0，而 skipA 和 skipB 可以是任意值。
这两个链表不相交，因此返回 null 。

链接：https://leetcode-cn.com/problems/intersection-of-two-linked-lists
"""
import mode
from mode import TreeNode
from mode import List
from mode import collections
from mode import ListNode
from mode import PrintListNode


class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode):
        a, b = [], []
        while headA:
            a.append(headA)
            headA = headA.next
        while headB:
            b.append(headB)
            headB = headB.next
        ans = None
        i, j = len(a) - 1, len(b) - 1
        while i >= 0 and j >= 0 and a[i] == b[j]:
            ans = a[i]
            i, j = i - 1, j - 1
        return ans


if __name__ == "__main__":
    """
    输入：intersectVal = 8, listA = [4,1,8,4,5], 
    listB = [5,0,1,8,4,5], skipA = 2, skipB = 3

    """
    a1 = ListNode(4)
    a2 = ListNode(1)
    a3 = ListNode(8)
    a4 = ListNode(4)
    a5 = ListNode(5)
    a1.next = a2
    a2.next = a3
    a3.next = a4
    a4.next = a5

    b1 = ListNode(5)
    b2 = ListNode(0)
    b3 = ListNode(1)

    b1.next = b2
    b2.next = b3
    # b3.next = a3

    PrintListNode(a1)
    PrintListNode(b1)

    A = Solution()
    print(A.getIntersectionNode(a1, b1))
